package persistencia;


//TODO: falta filtrar por tareas pendientes y ya realizadas.NO, NO SE USAN MAS. SOLO SE USA EL GETALL

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import negocio.Alumno;
import negocio.Contacto;
import negocio.Tarea;
import negocio.Administrativo;
import negocio.Usuario;

import java.util.ArrayList;
import java.util.Collections;

public class TareaDAO {
	
	private Connection c;
	private static TareaDAO instancia;
	
	private TareaDAO()
	{
		c = BDManager.getInstance().getConexion();
	}
	
	public static TareaDAO  getInstance()
	{
		if(instancia == null)
			instancia = new TareaDAO();
		return instancia;
	}
	
	
	public void guardar(Tarea t)
	{
		String query;
		if(t.getContactoApertura()!=null && t.getContactoCierre()!=null)//si tiene ambos contactos los guarda
		{
		query = String.format("INSERT INTO tarea(estado, fechalimite, tipo, usuariocreador, "
					+ "usuarioasignado, alumno, comentarios, contactoapertura,contactocierre) "
					+ "VALUES ('" + t.getEstado()+"','"+t.getFechaLimite()+"','"
					+t.getTipoTarea()+"','"+t.getUsuarioCreador().getDni()+"','"+t.getUsuarioAsignado().getDni()+"','" 
					+ t.getAlumno().getDni() +"','" + t.getComentarios()+ "',"+t.getContactoApertura().getId()+","
					+t.getContactoCierre().getId()+")");
		}
		else if(t.getContactoApertura()!=null&& t.getContactoCierre()==null)//si tiene solo contacto apertura lo guarda, y asigna 0 al otro
		{
			query = String.format("INSERT INTO tarea(estado, fechalimite, tipo, usuariocreador, "
					+ "usuarioasignado, alumno, comentarios, contactoapertura,contactocierre) "
					+ "VALUES ('" + t.getEstado()+"','"+t.getFechaLimite()+"','"
					+t.getTipoTarea()+"','"+t.getUsuarioCreador().getDni()+"','"+t.getUsuarioAsignado().getDni()+"','" 
					+ t.getAlumno().getDni() +"','" + t.getComentarios()+ "',"+t.getContactoApertura().getId()+","
					+0+")");
		}
		else if(t.getContactoApertura()==null &&t.getContactoCierre()!=null)//si tiene solo contacto de cierre lo guarda y asigna 0 al otro
		{
			query = String.format("INSERT INTO tarea(estado, fechalimite, tipo, usuariocreador, "
					+ "usuarioasignado, alumno, comentarios, contactoapertura,contactocierre) "
					+ "VALUES ('" + t.getEstado()+"','"+t.getFechaLimite()+"','"
					+t.getTipoTarea()+"','"+t.getUsuarioCreador().getDni()+"','"+t.getUsuarioAsignado().getDni()+"','" 
					+ t.getAlumno().getDni() +"','" + t.getComentarios()+ "',"+0+","
					+t.getContactoCierre().getId()+")");
		}
		
		else //si no tiene contacto de apertura ni de cierre guarda 0 en los dos
		{
			query = String.format("INSERT INTO tarea(estado, fechalimite, tipo, usuariocreador, "
					+ "usuarioasignado, alumno, comentarios, contactoapertura,contactocierre) "
					+ "VALUES ('" + t.getEstado()+"','"+t.getFechaLimite()+"','"
					+t.getTipoTarea()+"','"+t.getUsuarioCreador().getDni()+"','"+t.getUsuarioAsignado().getDni()+"','" 
					+ t.getAlumno().getDni() +"','" + t.getComentarios()+ "',"+0+","
					+0+")");
		}
	
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}

	

	public ArrayList<Tarea> getAll() {
		String query = "SELECT * FROM tarea order by estado, fechalimite";
		ArrayList<Tarea> res = new ArrayList<Tarea>();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			while(rs.next())
			{
				Contacto contactoApertura=null;
				Contacto contactoCierre=null;
				if(ContactoDAO.getInstance().getContacto(rs.getInt("contactoapertura"))!=null)
					contactoApertura=ContactoDAO.getInstance().getContacto(rs.getInt("contactoApertura"));
				if(ContactoDAO.getInstance().getContacto(rs.getInt("contactocierre"))!=null)
					contactoCierre=ContactoDAO.getInstance().getContacto(rs.getInt("contactocierre"));
				Usuario usuarioCreador = UsuarioDAO.getInstance().getUsuario(rs.getString("usuariocreador") );//HACER CLASES USUARIO CONTROLADOR Y USUARIO DAO, LUEGO TERMINAR ESTA VARIABLE.
				Usuario usuarioAsignado = UsuarioDAO.getInstance().getUsuario(rs.getString("usuarioasignado"));
				Alumno alumno = AlumnoDAO.getInstance().getAlumno(rs.getString("alumno"));
				res.add(new Tarea(rs.getInt("id"), rs.getDate("fechalimite"),rs.getString("tipo"),usuarioCreador,
						usuarioAsignado,rs.getString("estado"),alumno, rs.getString("comentarios"),contactoApertura,contactoCierre));
			}
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}
	
	public void cambiarEstado(int tareaID, String nuevoEstado)
	{
		String query = "UPDATE tarea SET estado='" + nuevoEstado + "' WHERE id=" + tareaID + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
	}
	
	
	//TODO: Miercoles, David.COMENTO TODAS ESTAS FUNCIONES PORQUE YA NO SE USAN.
	/*public ArrayList<Tarea> getAllTareasByFechaFinalizacion(String fecha) {
		String query = "SELECT * FROM tarea WHERE fechalimite="+fecha;
		ArrayList<Tarea> res = new ArrayList<Tarea>();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			while(rs.next())
			{				
				Usuario usuarioCreador = UsuarioDAO.getInstance().getUsuario(rs.getString("usuariocreador") );//HACER CLASES USUARIO CONTROLADOR Y USUARIO DAO, LUEGO TERMINAR ESTA VARIABLE.
				Usuario usuarioAsignado = UsuarioDAO.getInstance().getUsuario(rs.getString("usuarioasignado"));
				Alumno alumno = AlumnoDAO.getInstance().getAlumno(rs.getString("alumno"));
				res.add(new Tarea(rs.getInt("id"), rs.getDate("fechalimite"),rs.getString("tipo"),usuarioCreador,usuarioAsignado,rs.getString("estado"),alumno, rs.getString("comentarios")));
			}
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}	

	
	public ArrayList<Tarea> getAllTareasByAlumno(Alumno alu) {
		String query = "SELECT * FROM tarea WHERE alumno="+alu.getDni();
		ArrayList<Tarea> res = new ArrayList<Tarea>();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			while(rs.next())
			{				
				Usuario usuarioCreador = UsuarioDAO.getInstance().getUsuario(rs.getString("usuariocreador") );//HACER CLASES USUARIO CONTROLADOR Y USUARIO DAO, LUEGO TERMINAR ESTA VARIABLE.
				Usuario usuarioAsignado = UsuarioDAO.getInstance().getUsuario(rs.getString("usuarioasignado"));
				Alumno alumno = AlumnoDAO.getInstance().getAlumno(rs.getString("alumno"));
				res.add(new Tarea(rs.getInt("id"), rs.getDate("fechalimite"),rs.getString("tipo"),usuarioCreador,usuarioAsignado,rs.getString("estado"),alumno, rs.getString("comentarios")));
			}
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}	
	
	
	
	public ArrayList<Tarea> getAllTareasRealizadas(Usuario usu) {
		String query = "SELECT * FROM tarea WHERE estado='completada' and usuarioasignado="+usu.getDni();
		ArrayList<Tarea> res = new ArrayList<Tarea>();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			while(rs.next())
			{				
				Usuario usuarioCreador = UsuarioDAO.getInstance().getUsuario(rs.getString("usuariocreador") );//HACER CLASES USUARIO CONTROLADOR Y USUARIO DAO, LUEGO TERMINAR ESTA VARIABLE.
				Usuario usuarioAsignado = UsuarioDAO.getInstance().getUsuario(rs.getString("usuarioasignado"));
				Alumno alumno = AlumnoDAO.getInstance().getAlumno(rs.getString("alumno"));
				res.add(new Tarea(rs.getInt("id"), rs.getDate("fechalimite"),rs.getString("tipo"),usuarioCreador,usuarioAsignado,rs.getString("estado"),alumno, rs.getString("comentarios")));
			}
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}
	
	
	public ArrayList<Tarea> getAllTareasPendientes(Usuario usu) {
		String query = "SELECT * FROM tarea WHERE estado='incompletada' and usuarioasignado="+usu.getDni();
		ArrayList<Tarea> res = new ArrayList<Tarea>();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			while(rs.next())
			{				
				Usuario usuarioCreador = UsuarioDAO.getInstance().getUsuario(rs.getString("usuariocreador") );//HACER CLASES USUARIO CONTROLADOR Y USUARIO DAO, LUEGO TERMINAR ESTA VARIABLE.
				Usuario usuarioAsignado = UsuarioDAO.getInstance().getUsuario(rs.getString("usuarioasignado"));
				Alumno alumno = AlumnoDAO.getInstance().getAlumno(rs.getString("alumno"));
				res.add(new Tarea(rs.getInt("id"), rs.getDate("fechalimite"),rs.getString("tipo"),usuarioCreador,usuarioAsignado,rs.getString("estado"),alumno, rs.getString("comentarios")));
			}
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return res;
	}

	public void guardarContacto(Tarea tarea, Contacto contacto) {
		String query = "UPDATE tarea SET contacto='" + contacto.getId() + "' WHERE id=" + tarea.getId() + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
	}*/
	
	public Tarea getTarea(int id)
	{
		String query = "SELECT *FROM tarea WHERE id =" + id+";";
		Tarea res = null;
		try
		{
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			if(rs.next())
			{
				Contacto contactoApertura=null;
				Contacto contactoCierre=null;
				if(ContactoDAO.getInstance().getContacto(rs.getInt("contactoapertura"))!=null)
					contactoApertura=ContactoDAO.getInstance().getContacto(rs.getInt("contactoApertura"));
				if(ContactoDAO.getInstance().getContacto(rs.getInt("contactocierre"))!=null)
					contactoCierre=ContactoDAO.getInstance().getContacto(rs.getInt("contactocierre"));
				Usuario usuarioCreador = UsuarioDAO.getInstance().getUsuario(rs.getString("usuariocreador") );
				Usuario usuarioAsignado = UsuarioDAO.getInstance().getUsuario(rs.getString("usuarioasignado"));
				Alumno alumno = AlumnoDAO.getInstance().getAlumno(rs.getString("alumno"));
				res = new Tarea(rs.getInt("id"), rs.getDate("fechalimite"),rs.getString("tipo"),usuarioCreador,
						usuarioAsignado,rs.getString("estado"),alumno, rs.getString("comentarios"),contactoApertura, contactoCierre);
			}
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return res;

	}
	
	public void actualizar(Tarea tarea)
	{
		String query = "UPDATE tarea SET usuarioasignado='" + tarea.getUsuarioAsignado().getDni()+"', fechalimite='"+ tarea.getFechaLimite() +"' WHERE id=" + tarea.getId() + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
	}
	
	public void agregarContactoCierre(Tarea tarea, Contacto contacto)
	{
		String query = "UPDATE tarea SET contactocierre=" + contacto.getId()+" WHERE id=" + tarea.getId() + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	public void agregarMotivoCancelacion(Tarea tarea, String motivo)
	{
		String query = "UPDATE tarea SET motivocancelacion='" +motivo+"' WHERE id=" + tarea.getId() + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	public String getMotivoCancelacion(Tarea tarea)
	{
		String query = "Select motivocancelacion FROM tarea where id="+tarea.getId()+";";
		String res=null;
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			rs.next();
			res = rs.getString(1);
			s.close();
		} catch (SQLException e) {
			// TODO: handle exception
		}
		return res;
	}

	public void setFechaCreacion(Tarea tarea, Date fecha)
	{
		String query = "UPDATE tarea SET fechacreacion='" +fecha.toString()+"' WHERE id=" + tarea.getId() + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
		
	public void setFechaRealizacion(Tarea tarea, Date fecha)
	{
		String query = "UPDATE tarea SET fecharealizacion='" +fecha.toString()+"' WHERE id=" + tarea.getId() + ";";
		try {
			Statement s = c.createStatement();
			s.execute(query);
			s.close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	public Date getFechaCreacion(Tarea tarea)
	{
		String query = "Select fechacreacion FROM cursada where id="+tarea.getId()+";";
		Date res=null;
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			rs.next();
			res = rs.getDate(1);
			s.close();
		} catch (SQLException e) {
			// TODO: handle exception
		}
		return res;
	}
	
	public Date getFechaRealizacion(Tarea tarea)
	{
		String query = "Select fecharealizacion FROM cursada where id="+tarea.getId()+";";
		Date res=null;
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			rs.next();
			res = rs.getDate(1);
			s.close();
		} catch (SQLException e) {
			// TODO: handle exception
		}
		return res;
	}

	public int getUltimoId() {
		String query = "Select max(id) FROM tarea";
		int res = 0;
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(query);
			rs.next();
			res = rs.getInt(1);
			s.close();
		} catch (SQLException e) {
			// TODO: handle exception
		}
		return res;
	}

	
	
}
